package net.fltx.taskmgr.win32api;

import com.sun.jna.Native;
import com.sun.jna.win32.StdCallLibrary;

public interface Kernel32 extends StdCallLibrary {
    static Kernel32 INSTANCE = Native.load("Kernel32", Kernel32.class);//加载系统Kernel32 DLL文件，也可以是C++写的DLL文件

    //
    static final int TH32CS_SNAPheaplist = 0x1;
    static final int TH32CS_SNAPPROCESS = 0x2;
    static final int TH32CS_SNAPthread = 0x4;
    static final int TH32CS_SNAPmodule = 0x8;
    static final int TH32CS_SNAPall = TH32CS_SNAPPROCESS + TH32CS_SNAPheaplist + TH32CS_SNAPthread + TH32CS_SNAPmodule;

    //OpenProcess dwDesiredAccess参数常量
    static final int PROCESS_ALL_ACCESS = 0x001F0FFF; //所有能获得的权限
    static final int PROCESS_CREATE_PROCESS = 0x0080; //需要创建一个进程
    static final int PROCESS_CREATE_THREAD = 0x0002;  //需要创建一个线程
    static final int PROCESS_DUP_HANDLE = 0x0040;     //重复使用DuplicateHandle句柄
    static final int PROCESS_QUERY_INFORMATION = 0x0400;  //获得进程信息的权限，如它的退出代码、优先级
    static final int PROCESS_QUERY_LIMITED_INFORMATION = 0x1000;  /*获得某些信息的权限，如果获得了PROCESS_QUERY_INFORMATION，也拥有PROCESS_QUERY_LIMITED_INFORMATION权限*/
    static final int PROCESS_SET_INFORMATION = 0x0200;  //设置某些信息的权限，如进程优先级
    static final int PROCESS_SET_QUOTA = 0x0100;         //设置内存限制的权限，使用SetProcessWorkingSetSize
    static final int PROCESS_SUSPEND_RESUME = 0x0800;    //暂停或恢复进程的权限
    static final int PROCESS_TERMINATE = 0x0001;         //终止一个进程的权限，使用TerminateProcess
    static final int PROCESS_VM_OPERATION = 0x0008;      //操作进程内存空间的权限(可用VirtualProtectEx和WriteProcessMemory)
    static final int PROCESS_VM_READ = 0x0010;          //读取进程内存空间的权限，可使用ReadProcessMemory
    static final int PROCESS_VM_WRITE = 0x0020;       //读取进程内存空间的权限，可使用WriteProcessMemory
    static final int SYNCHRONIZE = 0x00100000;         //等待进程终止


    /**
     * 函数通过获取进程信息为指定的进程、进程使用的堆[HEAP]、模块[MODULE]、线程建立一个快照.
     *
     * @param lFlags
     * @param lProcessID
     * @return 快照句柄
     */
    int CreateToolhelp32Snapshot(int lFlags, int lProcessID);

    int Process32First(int hSnapShot, ProcessEntry32 uProcess);

    int Process32Next(int hSnapShot, ProcessEntry32 uProcess);

    int Module32First(int hSnapshot, ModuleEntry32 lpme);

    int Module32Next(int hSnapshot, ModuleEntry32 lpme);

    /**
     * 结束一个进程
     *
     * @param hProcess  指定要中断进程的句柄. 该句柄可以由 OpenProcess得到.
     * @param uExitCode 进程终止码
     * @return 返回非零值代表成功。0代表失败。
     */
    boolean TerminateProcess(int hProcess, int uExitCode);

    /**
     * 打开一个进程
     *
     * @param dwDesiredAccess 想拥有的该进程访问权限
     * @param bInheritHandle 进程句柄是否可被继承
     * @param dwProcessId 进程id
     * @return
     */
    int OpenProcess(int dwDesiredAccess, boolean bInheritHandle, int dwProcessId);

    /**
     * 关闭句柄,防止内存泄露
     * @param hObject
     * @return
     */
    int CloseHandle(int hObject);

    /**
     * 内存拷贝
     *
     * @param Destination 指向移动目的地址的指针。
     * @param Source      指向要复制的内存地址的指针。
     * @param Length      指定要复制的字节数。
     * @return
     */
    void RtlMoveMemory(byte[] Destination, int Source, int Length);

    /**
     * 检索指定模块的模块句柄。该模块必须已由调用进程加载。
     * @param path 已加载模块的名称（.dll或.exe文件）。如果省略文件扩展名，则追加默认的库扩展名.dll.
     * @return 如果函数成功，则返回值是指定模块的句柄。
     */
    int GetModuleHandleA(String path);

    /**
     * 针对之前调用的api函数，用这个函数取得扩展错误信息.
     * @return
     */
    int GetLastError () ;
}
